#ifndef DIALOGCOMPONENTS_H
#define DIALOGCOMPONENTS_H

#include <QWidget>
#include <QDialog>
#include <QTextEdit>
#include <QTextBrowser>
#include <QVBoxLayout>
#include <QHBoxLayout>

// 窗口基类，定义功能按钮和主体窗口布局
class BaseDialog : public QDialog
{
    Q_OBJECT
public:
    BaseDialog(QWidget * parent = nullptr);

    virtual ~BaseDialog() {}

protected:
    // 主界面添加控件
    void addWidget2BaseLayout(QWidget *pWidget, Qt::Alignment alignment = Qt::Alignment());
    // 主界面添加控件
    void addLayout2BaseLayout(QLayout *layout);
    // 添加控制按钮到底部工具栏
    void addWidget2FuncLayout(QWidget *pWidget, bool bAddStretch = false);

    // 底层添加确认按钮
    void addBaseFuncAction();
    // [子类选配]添加底部工具栏
    void addFuncLayout();
    // [子类选配]添加完成按钮
    void addFuncDone();
    // [子类选配]添加取消按钮
    void addFuncCancel();
    // [子类选配]工具栏添加间隔
    void addFuncStretch();

    // 确认按钮功能，由子类重写
    virtual bool funcDone(){return true;}
    // 取消按钮功能，由子类重写
    virtual void funcCancel(){}

private slots:
    // 确认按钮触发
    void slt_clicked_Done();
    // 取消按钮
    void slt_clicked_Cancel();

private:
    QVBoxLayout*        m_pQVBoxLayout;    // 主界面栅栏
    QHBoxLayout*        m_pLayoutFunc;
};

// 数据临时输入窗口
class DialogInput : public BaseDialog
{
    Q_OBJECT
public:
    // 窗口构建函数
    DialogInput(QWidget * parent = nullptr);

    virtual ~DialogInput() {}

protected:
    // [重写]完成按钮功能
    bool funcDone() override;
    // [重写]完成取消功能
    void funcCancel() override;

signals:
    // 文本发送信号
    void sendInputData(QString&);

private:
    QTextEdit*  m_pQTextEdit;   // 文本输入窗口
};

// 数据临时输出窗口
class DialogOutput : public BaseDialog
{
    Q_OBJECT
public:
    // 窗口构建函数
    DialogOutput(QWidget * parent = nullptr);

    virtual ~DialogOutput() {}
    // 输入待展示数据并弹出窗口
    void inputData(const QString &strShow);

private slots:
    // 拷贝文本
    void slt_Copy2Clipboard();

private:
    QTextBrowser* m_pQTextBrowser;  // 文本展示窗口
};

#endif // DIALOGCOMPONENTS_H
